﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 里式转换原则01
{
    // 里氏转换的作用是消除不同子类之间类型的差异，把其类型转为同一的数据类型（把每一个子类都能用父类表示），
    // 这样就可以写出一套通用的代码，这样可以最大程度的重用代码，提高程序开发的效率

    // 里氏转换原则衡量了继承的质量，复合原则则继承的质量高，代码健壮；不符合原则那么继承的质量低，代码更容易出现问题

    class Program
    {
        static void Main(string[] args)
        {
            // 父类的引用指向子类对象
            // 里氏转换：子类可以直接给父类赋值，即父类的引用指向子类的对象
            Person person = new Student();
            person.Name = "xiaoming";
            // 转换之后可以调用父类里面的公有成员，子类里面的公有成员调用不到

            // 里氏转换：父类可以转换（强制）成子类，这样就能调用子类中的成员
            Student stu = person as Student;    //as这里用作了强制转换，如果转换成功就转换成as后面的类型，否则返回null
            //Student stu = (Student)person;
            stu.Score = 10;

        }
    }

    public class Person
    {
        public string Name { get; set; }
    }

    public class Student : Person
    {
        public int Score { get; set; }
    }
}
